package com.gollum.web.domain;

import cn.hutool.core.date.BetweenFormatter;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.lang.management.ManagementFactory;
import java.util.Date;

/**
 * jvm信息
 *
 * @author Herther
 * @createTime 2022年10月20日 23:07:00
 * @since 1.0.0
 */
@ToString
@Setter
@Accessors(chain = true)
public class Jvm {
    /**
     * 当前JVM占用的内存总数(M)
     */
    private double total;

    /**
     * JVM最大可用内存总数(M)
     */
    private double max;

    /**
     * JVM空闲内存(M)
     */
    private double free;

    /**
     * JDK版本
     */
    private String version;

    /**
     * JDK路径
     */
    private String home;

    /** JVM名称 **/
    private String name;

    /** JVM运行时长 **/
    private String runTime;

    /** 服务启动时间 **/
    private Date startTime;

    /** 运行参数 **/
    private String runTimeArgs;

    /** vm version版本 **/
    private String vmVersion;

    public String getVmVersion() {
        return vmVersion;
    }

    public String getHome() {
        return home;
    }

    public double getTotal() {
        return NumberUtil.div(total, (1024 * 1024), 2);
    }

    public double getMax() {
        return NumberUtil.div(max, (1024 * 1024), 2);
    }

    public double getFree()
    {
        return NumberUtil.div(free, (1024 * 1024), 2);
    }

    public double getUsed()
    {
        return NumberUtil.div(total - free, (1024 * 1024), 2);
    }

    public double getUsage()
    {
        return NumberUtil.div(total - free, total, 4);
    }

    public String getVersion() {
        return version;
    }

    /**
     * 获取服务启动时间
     */
    public Date getStartTime()
    {
        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
        return new Date(time);
    }

    /**
     * 获取JDK名称
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/10/20 23:26
     */
    public String getName()
    {
        return ManagementFactory.getRuntimeMXBean().getVmName();
    }

    /**
     * 获取运行时间
     *
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/10/20 23:27
     */
    public String getRunTime()
    {
        long beginTime = getStartTime().getTime();
        long endTime = System.currentTimeMillis();
        return DateUtil.formatBetween(endTime - beginTime, BetweenFormatter.Level.MINUTE);
    }

    /**
     * 运行参数
     *
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/10/20 23:30
     */
    public String getRunTimeArgs()
    {
        return ManagementFactory.getRuntimeMXBean().getInputArguments().toString();
    }


}
